<?php
namespace app\api\controller;
use think\Controller;
use think\Db;

class App extends Controller
{
    /* 登录页面 */
    public function index()
    {
        try {
            $params = request()->param();  // 获取参数

            $action = request()->route('action');  // 请求接口方法
            $method_type = request()->method(); // 请求类型

            $apiList = config('api'); // 接口列表
            $classNamespace = $method = $is_optional = '';  // 初始化 接口地址、接口方法 、data参数是否可选

            $member_ip = input('?param.member_ip') ? input('param.member_ip') : '';

            //根据 请求接口方法 查找  接口地址
            foreach ($apiList as $key => $values)
            {
                if ($action == $key)
                {
//                    if($method_type != $values['method']) {
//                        return json(['data'=>'','code'=>400002,'message'=>'FAULT']);
//                    }

                    $method = $key;
                    $classNamespace = $values['path'];
                    if (isset($values['is_optional'])) {
                        $is_optional = $values['is_optional'];
                    }
                    break;
                }
            }
            //如果没有找到对应的接口  返回错误信息
            if (!$method)
            {
                return json(['data'=>'','code'=>400003,'message'=>'FAULT']);
            }
            $param = []; // 初始化业务数据
            // 判断接口是否需要验证身份
            if(!in_array($action, ['get_time', 'WxpayNotify', 'AlipayNotify'])) {

                if(!isset($params['data']) && !$is_optional) { // 如果$is_optional为否 并且 没有传递data 则报错，  $is_optional为否表示data必传
                    return json(['data'=>'','code'=>400076,'message'=>'FAULT']);
                }

                if(!isset($params['data']) && $is_optional) { // 如果$is_optional为真 并且 没有传递data 则设置$params['data'] = [], 防止下面获取数据时报错，  $is_optional为真表示data可选
                    $params['data'] = [];
                }

                // 验证接口请求方身份
                $check_data = check_merchant($params);
                if($check_data['code'] != 200) {
                    return json($check_data);
                }

                $param = $params['data'];  //
                if(!is_array($param)) { // 如果不是数组就进行json解析
                    $param = json_decode($param, true);  //
                    if (!$param) {
                        return json(['data'=>'2','code'=>400077,'message'=>'FAULT']);
                    }
                }
                // 以上检查全部通过  记录请求日志
                $add_interface_request_log = add_interface_request_log($params, $action, $member_ip, $param);
                if($add_interface_request_log['code'] != 200) {
                    return json($add_interface_request_log);
                }
            }

            // 使用php反射机制  调用对应的接口地址中的接口方法
            $class = new \ReflectionClass($classNamespace);
            $classMethod = $class->getMethod($method);
            //return json($param);
            $return = call_user_func(array($class->name, $classMethod->name), $param);
            $return['interface'] = $action;

//            if ($return['code'] != 200) {
//                $data['data'] = '';
//                $return = array_merge($data, $return);
//            }
            return json($return);
        } catch (\Exception $e) {
            return json(['code' => 0, 'msg' => $e->getMessage()]);
        }
    }

}
